// 视频片花跳过器 - 后台脚本
(() => {
  // 记录脚本已注入的标签页
  const injectedTabs = new Set();
  
  // 每个标签页的视频状态
  const tabVideoStatus = {};

  // 初始化
  function init() {
    console.log('视频片花跳过器: 后台服务启动');
    
    // 在标签页更新时注入脚本
    chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
      // 只处理http和https页面
      if (!tab.url || !tab.url.match(/^https?:\/\//)) return;
      
      // 当页面加载完成时
      if (changeInfo.status === 'complete') {
        console.log(`标签页 ${tabId} 加载完成，准备注入脚本`);
        
        // 使用try-catch块来捕获可能的错误
        try {
          // 检查标签页状态
          chrome.tabs.get(tabId, (tab) => {
            if (chrome.runtime.lastError) {
              console.error(`无法获取标签页信息: ${chrome.runtime.lastError.message}`);
              return;
            }
            
            if (tab && tab.status === 'complete') {
              injectContentScript(tabId);
            }
          });
        } catch (err) {
          console.error(`尝试注入脚本时出错: ${err.message}`);
        }
      }
    });
    
    // 监听来自popup或content script的消息
    chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
      try {
        console.log('收到消息:', message, '来自:', sender);
        
        if (message.action === 'contentScriptLoaded') {
          // 内容脚本加载确认
          if (sender.tab && sender.tab.id) {
            injectedTabs.add(sender.tab.id);
            console.log(`标签页 ${sender.tab.id} 的内容脚本已加载`);
          }
          sendResponse({ success: true });
          return false;
        }
        
        if (message.action === 'checkVideoInTab') {
          // 从popup请求检查视频
          const tabId = message.tabId;
          
          // 确保标签页存在
          chrome.tabs.get(tabId, (tab) => {
            if (chrome.runtime.lastError) {
              console.error(`标签页不存在: ${chrome.runtime.lastError.message}`);
              sendResponse({ hasVideo: false, error: '标签页不存在或已关闭' });
              return;
            }
            
            // 确保脚本已注入
            if (!injectedTabs.has(tabId)) {
              injectContentScript(tabId).then(() => {
                // 脚本注入后，向content script发送检查视频的消息
                sendMessageToTab(tabId, { action: 'findVideo' }, (response) => {
                  sendResponse(response);
                });
              }).catch(error => {
                console.error('注入脚本失败:', error);
                sendResponse({ hasVideo: false, error: '无法注入内容脚本' });
              });
              return true; // 将异步发送响应
            }
            
            // 脚本已注入，直接发送检查请求
            sendMessageToTab(tabId, { action: 'findVideo' }, (response) => {
              sendResponse(response);
            });
          });
          return true; // 将异步发送响应
        }
        
        // 如果是来自content script的视频状态更新
        if (message.action === 'updateVideoStatus' && sender.tab) {
          tabVideoStatus[sender.tab.id] = message.hasVideo;
          console.log(`更新标签页 ${sender.tab.id} 的视频状态为: ${message.hasVideo}`);
          sendResponse({ success: true });
          return false;
        }
        
        // 将其他消息转发给相应的标签页
        if (message.tabId && message.forwardToContent) {
          sendMessageToTab(message.tabId, message.data, sendResponse);
          return true; // 将异步发送响应
        }
        
        // 默认响应
        sendResponse({ success: false, error: '未知的消息类型' });
      } catch (err) {
        console.error(`处理消息时出错: ${err.message}`);
        sendResponse({ success: false, error: err.message });
      }
      return true;
    });

    // 当插件安装或更新时，向用户显示一个通知
    chrome.runtime.onInstalled.addListener(details => {
      if (details.reason === 'install') {
        chrome.tabs.create({
          url: 'https://github.com/yourusername/video-skipper-js', // 可以替换为实际的帮助页面
          active: true
        });
      }
    });
  }
  
  // 安全地向标签页发送消息
  function sendMessageToTab(tabId, message, callback) {
    try {
      // 先检查标签页是否存在
      chrome.tabs.get(tabId, (tab) => {
        if (chrome.runtime.lastError) {
          console.warn(`标签页 ${tabId} 不存在:`, chrome.runtime.lastError.message);
          if (callback) callback({ error: '标签页不存在或已关闭' });
          return;
        }
        
        // 标签页存在，发送消息
        chrome.tabs.sendMessage(tabId, message, (response) => {
          if (chrome.runtime.lastError) {
            console.warn(`向标签页 ${tabId} 发送消息失败:`, chrome.runtime.lastError.message);
            
            // 可能内容脚本未加载，尝试重新注入
            if (!injectedTabs.has(tabId)) {
              injectContentScript(tabId).then(() => {
                // 重试发送消息
                chrome.tabs.sendMessage(tabId, message, (retryResponse) => {
                  if (chrome.runtime.lastError) {
                    console.error(`重试发送消息失败:`, chrome.runtime.lastError.message);
                    if (callback) callback({ error: '无法与页面建立连接，请刷新页面后重试' });
                  } else {
                    if (callback) callback(retryResponse || {});
                  }
                });
              }).catch(error => {
                console.error('重新注入脚本失败:', error);
                if (callback) callback({ error: '无法注入内容脚本，请刷新页面后重试' });
              });
            } else {
              if (callback) callback({ error: chrome.runtime.lastError.message });
            }
          } else {
            if (callback) callback(response || {});
          }
        });
      });
    } catch (error) {
      console.error('发送消息出错:', error);
      if (callback) callback({ error: error.message });
    }
  }
  
  // 向指定标签页注入内容脚本
  async function injectContentScript(tabId) {
    // 检查是否已注入
    if (injectedTabs.has(tabId)) {
      console.log(`标签页 ${tabId} 已注入内容脚本，跳过`);
      return;
    }
    
    try {
      console.log(`正在向标签页 ${tabId} 注入内容脚本...`);
      
      // 注入内容脚本
      const results = await chrome.scripting.executeScript({
        target: { tabId: tabId },
        files: ['js/content.js']
      });
      
      console.log(`成功向标签页 ${tabId} 注入内容脚本:`, results);
      injectedTabs.add(tabId);
      
      // 监听标签页移除事件，清理记录
      const onRemoved = (removedTabId) => {
        if (removedTabId === tabId) {
          injectedTabs.delete(tabId);
          delete tabVideoStatus[tabId];
          chrome.tabs.onRemoved.removeListener(onRemoved);
          console.log(`标签页 ${tabId} 已关闭，清理资源`);
        }
      };
      
      chrome.tabs.onRemoved.addListener(onRemoved);
      
      return results;
    } catch (error) {
      console.error(`向标签页 ${tabId} 注入内容脚本失败:`, error);
      throw error;
    }
  }
  
  // 初始化
  init();
})(); 